/**
@brief module de gestion du jeu
@file jeu.h
@date 2012/06/07
*/

#ifndef _JEU_H
#define _JEU_H

#include "mario.h"
#include "terrain.h"

/**
\struct jeu jeu.h
@brief contient un terrain et les differents personnages
*/
typedef struct
{
	terrain ter;
   	mario mario;
   	mario luigi;
   	clock_t tempsBombe;
   	time_t tempsEnnemi;
   	time_t tempsInvincible;
} jeu;

/**
@brief initialise le jeu en fonction du terrain et du mode de jeu
@param[in,out] pJeu pointeur sur jeu
@param[in] numeroTerrain entier
@param[in] mode entier
@return none
*/
void jeuInit(jeu *pJeu, const int numeroTerrain, const int mode);

/**
@brief initialise le jeu en fonction du terrain et du mode de jeu
@param[in,out] pJeu pointeur sur jeu
@param[in] touche caractere
@param[in] mode entier
@return none
*/
void jeuActionClavier(jeu *pJeu, const char touche, const int mode);

/**
@brief récupere le terrain de la structure jeu
@param[in,out] pJeu pointeur sur jeu
@return pointeur sur terrain
*/
terrain *jeuGetTerrainPtr(jeu *pJeu);

/**
@brief récupere le mario de la structure jeu
@param[in,out] pJeu pointeur sur jeu
@return pointeur sur mario
*/
mario *jeuGetMarioPtr(jeu *pJeu);

/**
@brief récupere le luigi de la structure jeu
@param[in,out] pJeu pointeur sur jeu
@return pointeur sur mario
*/
mario *jeuGetLuigiPtr(jeu *pJeu);

/**
@brief récupère le terrain du jeu en const
@param[in,out] pJeu pointeur sur jeu
@return pointeur sur terrain
*/
const terrain *jeuGetConstTerrainPtr(const jeu *pJeu);

/**
@brief récupère le mario du jeu en const
@param[in,out] pJeu pointeur sur jeu
@return pointeur sur mario
*/
const mario *jeuGetConstMarioPtr(const jeu *pJeu);

/**
@brief récupère le luigi du jeu en const
@param[in,out] pJeu pointeur sur jeu
@return pointeur sur mario
*/
const mario *jeuGetConstLuigiPtr(const jeu *pJeu);

/**
@brief s'occupe des explosion de bombes et verifie si l'un des hero est mort
@param[in,out] pJeu pointeur sur jeu
@param[in] mode entier
@return entier (0 si mario mort, 1 sinon)
*/
int gestionExplosion(jeu* pJeu, mario* marioM, mario* luigiL, const int mode);

/**
@brief s'occupe du déplacement des ennemis
@param[in,out] pJeu pointeur sur jeu
@param[in] mode entier
@return none
*/
void deplaceEnnemis(jeu* pJeu, const int mode);

/**
@brief ajoute ou non des bonus a mario si des caisses ont été détruites
@param[in,out] pJeu pointeur sur jeu
@param[in] nbCaissesAvant entier
@return none
*/
void obtientBonus(jeu* jeu, mario* mario, const int nbCaissesAvant);

/**
@brief gestion de l'invinscibilité de mario
@param[in,out] pJeu pointeur sur jeu
@param[in] i entier
@return none
*/
void marioInvincible(jeu* jeu, mario* mario, const int i);

/**
@brief verifie si mario a été touché par l'ennemi
@param[in,out] pJeu pointeur sur jeu
@param[in] i entier (num de l'ennemi)
@param[in] direction caractere (direction du deplacement de mario si il est touché)
@param[in] mode entier
@return entier (0 mario est mort, 2 mario touché mais pas mort, 1 si mario non touché)
*/
int gestionDegats(jeu* jeu, mario* mario, const int i, const char direction);

/**
@brief compte le nombre d'ennemis restants
@param[in] pJeu pointeur sur jeu
@return entier
*/
int compteEnnemis(jeu* jeu);

/**
@brief libère la mémoire alloué par le jeu
@param[in,out] pJeu pointeur sur jeu
@return noone
*/
void jeuLibere(jeu* pJeu);

#endif
